#ifndef ARCO_H
#define ARCO_H

#include "nodo.h"
#include "elemento_ui.h"

class Arco : public Elemento_ui
{
    public:
        /** Default constructor */
        Arco();

        /** Costruttore che inizializza un arco orientato di lunghezza fissata.
         * La destinazione viene creata temporaneamente NULL.
        */
        Arco(Nodo* origine, Nodo* destinazione, int lunghezza) : origine(origine), destinazione(destinazione), lunghezza(lunghezza)
        {   }

        /** Default destructor */
        virtual ~Arco();
        /** Lunghezza
         * \return La lunghezza corrente dell'arco
         */
        gint get_lunghezza() { return lunghezza; }
        /** Imposta la lunghezza
         * \param val La nuova lunghezza dell'arco
         */
        void set_lunghezza(gint val) { lunghezza = val; }
        /** Nodo di origine.
         * Il nodo di origine è il nodo dal quale proviene l'arco
         * \return L'origine corrente
         */
        Nodo* get_origine() { return origine; }
        /** Imposta il nodo di origine
         * \param val Nuovo nodo di origine
         */
        void set_origine(Nodo* val) { origine = val; }
        /** Nodo di destinazione.
         * Il nodo di destinazione è il nodo verso il quale è puntato l'arco
         * \return La destinazione dell'arco
         */
        Nodo* get_destinazione() { return destinazione; }
        /** Imposta il nodo di destinazione
         * \param val Nuovo nodo di destinazione
         */
        void set_destinazione(Nodo* val) { destinazione = val; }

        /** Definisce se l'arco fa parte dei cammini minimi calcolati dall'algoritmo
         * \return TRUE se fa parte del cammino minimo, FALSE altrimenti
         */
        gboolean is_minimo();

	virtual void update(gdouble x, gdouble y);
	virtual void draw(cairo_t* &cr);
	virtual gboolean intersect(gdouble x, gdouble y);
    protected:
    private:
        Nodo* origine; //!< Member variable "origine"
        Nodo* destinazione; //!< Member variable "destinazione"
        gint lunghezza; //!< Member variable "lunghezza"
        
        /** Calcola i vertici della freccia dell'arco.
         * @param[in] start_x
         * @param[in] start_y
         * @param[in] end_x
         * @param[in] end_y
         * @param[out] x1
         * @param[out] y1
         * @param[out] x2
         * @param[out] y2
         */
        void calcola_vertici_freccia(gdouble start_x, gdouble start_y, gdouble end_x, gdouble end_y, gdouble& x1, gdouble& y1, gdouble& x2, gdouble& y2);
        
        /** Partendo dalle coordinate dei nodi di origine e destinazione calcola le coordinate dell'arco.
         * Le coordinate di inizio e di fine sono le intersezioni tra la retta congiungente i centri dei due nodi con le circonferenze dei nodi stessi.
         * In questo modo le frecce non andranno a sovrapporsi con i nodi.
         * @param[out] start_x La nuova coordinata X di partenza dell'arco
         * @param[out] start_y La nuova coordinata Y di partenza dell'arco
         * @param[out] end_x La nuova coordinata X di arrivo dell'arco
         * @param[out] end_y La nuova coordinata Y di arrivo dell'arco
         */
        void calcola_nuovi_inizio_fine(gdouble &start_x, gdouble &start_y, gdouble &end_x, gdouble &end_y);
};

#endif // ARCO_H
